/*
洛谷1506
4 5
00000
00*00
0*0*0
00*00
输出：1

5 5
*****
*0*0*
**0**
*0*0*
*****
输出：5

这个题的要求是：输出四面被*包围的0有几个
难点在于：
00000
00*00
0*0*0    例如左边这种，被*包起来的0有两个，这两个0是连在一起的，所以不能单独判断一个0的四周是否是*
0*0*0
00*00

难点二：
5 5
0*000
*0000
00000
00000
00000

这种情况，当搜到第一个0就搜不下去了，所以应该在最外面再加一圈都为0
*/
/*
在外面加一圈以后，输入是从1到n，但搜是从0到n+1，

*/
#include<bits/stdc++.h>
using namespace std;
int n,m;
int a[505][505];
char ch;
int dx[]={1,0,0,-1};
int dy[]={0,1,-1,0};
int ans=0;
void dfs(int x,int y){
    //如果为*(即1)或走过(即2) 就return，这里的if要放在最前面，不仅是判断自己，也要判断下面要走的
	if(x<0||x>n+1||y<0||y>m+1||a[x][y])
		return;
	a[x][y]=2;//走过的记为2
	for(int i=0;i<4;i++){
		int tx=x+dx[i];
		int ty=y+dy[i];
		dfs(tx,ty);
	}
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>ch;//当为0时记为0，为*时记为1
			if(ch=='0') a[i][j]=0;
			else a[i][j]=1;
		}
	}
    //从左上角开始搜索，如果遇到墙或走过了就回退,这样就进不去
    //这样就保证了如果墙里有两个0也可以正确判断
	dfs(0,0);
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
            //统计0的个数
			if(!a[i][j]){
				ans++;
			}
		}
	}
	cout<<ans;
	return 0;
} 




